import jbook.util.Input;
import java.util.*;
import java.util.regex.*;

public class Gestione {

	public static HashMap<String, RubricaIterabile> rubriche = new HashMap<String, RubricaIterabile>();

	public static void main(String[] args) {
		char c;
		RubricaIterabile r;
		String s, name, email;
		int numCont;
		System.out.print("Benvenuto\\a nel programma rubrica!\n\n\n"
				+ "Si prega di iniziare creando una rubrica!\n\n");
		System.out.println("Definire nome della rubrica: ");
		s = Input.readString();
		System.out.print("Definire grandezza della rubrica: ");
		numCont = Input.readInt();
		creaRubrica(s, numCont);
		do {
			System.out.println("\n\n\nMenu' contestuale:\n\n\n"
					+ "\tn --- Crea una nuova rubrica\n"
					+ "\ta --- Aggiungi un contatto ad una rubrica\n"
					+ "\tc --- Cerca un contatto in una rubrica\n"
					+ "\tr --- Rimuovi contatto\\i da una rubrica\n"
					+ "\ts --- Stampa una rubrica\n\n" + "\te --- Uscita\n\n\n"
					+ "Scegli un opzione per piacere: ");
			c = Input.readChar();
			System.out.print("\n\n\n");
			switch (c) {
			case 'n':
				System.out.print("Creazione di una nuova rubrica:\n\n"
						+ "Definire nome della rubrica: ");
				s = Input.readString();
				System.out.print("Definire grandezza della rubrica: ");
				numCont = Input.readInt();
				creaRubrica(s, numCont);
				break;
			case 'a':
				System.out
						.print("A quale rubrica si vuole aggiungere il contatto?");
				s = Input.readString();
				r = rubriche.get(s);
				if (r != null) {
					System.out.print("Quale contatto si vuole aggiungere?\n");
					do {
						System.out.print("Nome");
						name = Input.readString();
						if (Pattern.matches("[a-zA-Z]+(\\s[a-zA-Z]+)*", name))
							break;
						else
							System.out.println("Valori inseriti non validi");
					} while (true);
					do {
						System.out.print("e-mail: ");
						email = Input.readString();
						if (Pattern
								.matches(
										"^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$",
										email))
							break;
						else
							System.out.println("Valori inseriti non validi");
					} while (true);
					System.out
							.print("Quanti numeri di telefono si vogliono inserire? ");
					int numTel = Input.readInt();
					Vector<String> tel = new Vector<String>();
					if (numTel > 0)
						System.out
								.println("Inserire il trattino (-) tra prefisso e numero");
					for (int i = 0; i < numTel; i++) {
						do {
							System.out.print("Numero #" + (i + 1));
							s = Input.readString();
							if (Pattern.matches("\\d+-\\d+", s)) {
								tel.add(s);
								break;
							} else
								System.out
										.println("Valori inseriti non validi");
						} while (true);
					}
					System.out.print("Si vuole aggiungere una nota? [y/n] ");
					String nota;
					if (Input.readString().toLowerCase().equals("y")) {
						System.out.print("Nota: ");
						nota = Input.readString();
						r.aggiungi(name, email, nota, tel);
					}
				} else
					System.out.print("****** La rubrica " + s
							+ " non esiste! ******\n\n\n");
				break;
			case 'c':
				System.out
						.print("In quale rubrica si vuole cercare il contatto?");
				s = Input.readString();
				r = rubriche.get(s);
				if (r != null) {
					System.out
							.print("Il contatto si vuole cercare per nome o per email? [N/e] ");
					char b = Input.readChar();
					switch (b) {
					case 'e':
						System.out
								.print("Quale contatto si vuole cercare per email? ");
						s = Input.readString();
						System.out
								.println("\n\n\nEcco il\\i contatto\\i trovato\\i:\n\n");
						r.stampaArray(r.cercaContattoEmail(s));
						break;
					default:
						System.out.print("Quale contatto si vuole cercare? ");
						s = Input.readString();
						System.out.print("Ricerca case sensitive? [y/N]");
						char d = Input.readChar();
						switch (d) {
						case 'y':
							System.out
									.println("\n\n\nEcco il\\i contatto\\i trovato\\i:\n\n");
							r.stampaArray(r.cercaContattoCS(s));
						default:
							System.out
									.println("\n\n\nEcco il\\i contatto\\i trovato\\i:\n\n");
							r.stampaArray(r.cercaContatto(s));
						}
					}

				} else
					System.out.print("****** La rubrica " + s
							+ " non esiste! ******\n\n\n");
				break;
			case 'r':
				System.out
						.print("Da quale rubrica si vuole cancellare uno o piu' contatti?");
				s = Input.readString();
				r = rubriche.get(s);
				if (r != null) {
					System.out.print("Quale contatto si vuole cancellare? ");
					s = Input.readString();
					Vector<Elemento> elimina = r.cercaContatto(s);
					for (Elemento i : elimina) {
						System.out
								.println("Vuoi davvero eliminare il contatto ***"
										/*
										 * + i.nome + i.email + i.note + i.tel
										 */+ i + "*** della rubrica?" + "[y/N]");
						if (Input.readString().toLowerCase().equals("y"))
							r.eliminaContatto(i);
						;
					}
				} else
					System.out.print("****** La rubrica " + s
							+ " non esiste! ******\n\n\n");
				break;
			case 's':
				System.out.print("Quale rubrica si vuole stampare? ");
				s = Input.readString();
				r = rubriche.get(s);
				if (r != null) {
					r.stampaRubrica();
				} else
					System.out.print("****** La rubrica " + s
							+ " non esiste! ******\n\n\n");
				break;
			case 'e':
				System.out
						.println("Grazie per aver utilizzato il mio programma! :D ");
				continue;
			default:
				continue;
			}
		} while (c != 'e');
	}

	public static void creaRubrica(String nome, int numCont) {
		RubricaIterabile r = new RubricaIterabile(nome, numCont);
		rubriche.put(nome, r);
	}
}
